package com.qf.service.impl;

import com.qf.dao.CartDao;
import com.qf.dao.OrderDao;
import com.qf.dao.impl.CartDaoImpl;
import com.qf.dao.impl.OrderDaoImpl;
import com.qf.domain.CartItem;
import com.qf.domain.Goods;
import com.qf.domain.Order;
import com.qf.domain.OrderDetail;
import com.qf.service.GoodsService;
import com.qf.service.OrderService;
import com.qf.utils.DataSourceUtils;
import com.qf.utils.RandomUtils;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/*
 *                             _ooOoo_
 *                            o8888888o
 *                            88" . "88
 *                            (| -_- |)
 *                            O\  =  /O
 *                         ____/`---'\____
 *                       .'  \\|     |//  `.
 *                      /  \\|||  :  |||//  \
 *                     /  _||||| -:- |||||-  \
 *                     |   | \\\  -  /// |   |
 *                     | \_|  ''\---/''  |   |
 *                     \  .-\__  `-`  ___/-. /
 *                   ___`. .'  /--.--\  `. . __
 *                ."" '<  `.___\_<|>_/___.'  >'"".
 *               | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 *               \  \ `-.   \_ __\ /__ _/   .-` /  /
 *          ======`-.____`-.___\_____/___.-`____.-'======
 *                             `=---='
 *          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 *                     佛祖保佑        永无BUG
 *            佛曰:
 *                   写字楼里写字间，写字间里程序员；
 *                   程序人员写程序，又拿程序换酒钱。
 *                   酒醒只在网上坐，酒醉还来网下眠；
 *                   酒醉酒醒日复日，网上网下年复年。
 *                   但愿老死电脑间，不愿鞠躬老板前；
 *                   奔驰宝马贵者趣，公交自行程序员。
 *                   别人笑我忒疯癫，我笑自己命太贱；
 *                   不见满街漂亮妹，哪个归得程序员？
 */
public class OrderServiceImpl implements OrderService {
    private OrderDao orderDao=new OrderDaoImpl();
    @Override
    public Order addOrder(Integer uid, Integer aid, List<CartItem> cartList) {

        try {
            DataSourceUtils.begin();
            //三张表
            //1 向订单表添加数据
            //计算订单money
            BigDecimal sum=new BigDecimal(0);
            List<OrderDetail> orderDetails=new ArrayList<>();
            String oid=RandomUtils.createOrderId();
            for (CartItem cartItem : cartList) {
                sum=sum.add(cartItem.getMoney());
                orderDetails.add(new OrderDetail(0, oid, cartItem.getPid(), cartItem.getNum(), cartItem.getMoney()));
            }
            // 1 未支付  2 已支付，未发货  3 已发货  4 已完成
            Order order=new Order(oid, uid, sum, "1", new Date(), aid);
            OrderDao orderDao=new OrderDaoImpl();
            orderDao.insert(order);


            //2 订单详情表
            for (OrderDetail orderDetail : orderDetails) {
                orderDao.insertDetail(orderDetail);
            }


            //3 清空购物车

            CartDao cartDao=new CartDaoImpl();
            cartDao.delete(uid);

            DataSourceUtils.commit();
            return order;

        } catch (SQLException e) {
            e.printStackTrace();
            try {
                DataSourceUtils.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            throw new RuntimeException(e);
        }finally {
            try {
                DataSourceUtils.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }

    @Override
    public void updateStatus(String oid, String status) {

        orderDao.updateStatus(oid,status);
    }

    @Override
    public List<Order> findByUid(Integer uid) {
        return orderDao.selectByUid(uid);
    }

    @Override
    public Order findByOid(String oid) {
       return orderDao.selectByOid(oid);
    }

    @Override
    public List<OrderDetail> findOrderDetailByOid(String oid) {
        List<OrderDetail> orderDetails = orderDao.selectOrderDetailByOid(oid);
        if(orderDetails!=null){
            GoodsService goodsService=new GoodsServiceImpl();
            for (OrderDetail orderDetail : orderDetails) {
                Goods goods = goodsService.findById(orderDetail.getPid());
                orderDetail.setGoods(goods);
            }
        }
        return orderDetails;
    }
}
